﻿using System;
using System.Runtime.Serialization;

namespace Kyoh.Lib.IO.Ini
{
    /// <summary>Ini設定ファイルの書式エラーを表す例外クラスです。</summary>
    [Serializable]
    public class IniFileFormatException : Exception
    {
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        public IniFileFormatException() : this(null) { }
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="message">例外のメッセージ。</param>
        public IniFileFormatException(string message) : base(message) { }
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="message">例外のメッセージ。</param>
        /// <param name="inner">内部例外を表す <see cref="Exception"/>。</param>
        public IniFileFormatException(string message, Exception inner) : base(message, inner) { }
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="sectionName">例外の発生したセクション名。</param>
        /// <param name="line">例外の発生した行位置。</param>
        /// <param name="index">例外の発生した列位置。</param>
        public IniFileFormatException(string sectionName, string line, int index)
            : base()
        {
            SectionName = sectionName;
            Line = line;
            LineIndex = index;
        }
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="sectionName">例外の発生したセクション名。</param>
        /// <param name="line">例外の発生した行位置。</param>
        /// <param name="index">例外の発生した列位置。</param>
        /// <param name="inner">内部例外を表す <see cref="Exception"/>。</param>
        public IniFileFormatException(string sectionName, string line, int index, Exception inner)
            : base(null, inner)
        {
            SectionName = sectionName;
            Line = line;
            LineIndex = index;
        }
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="message">例外のメッセージ。</param>
        /// <param name="sectionName">例外の発生したセクション名。</param>
        /// <param name="line">例外の発生した行位置。</param>
        /// <param name="index">例外の発生した列位置。</param>
        public IniFileFormatException(string message, string sectionName, string line, int index)
            : base(message)
        {
            SectionName = sectionName;
            Line = line;
            LineIndex = index;
        }
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="message">例外のメッセージ。</param>
        /// <param name="sectionName">例外の発生したセクション名。</param>
        /// <param name="line">例外の発生した行位置。</param>
        /// <param name="index">例外の発生した列位置。</param>
        /// <param name="inner">内部例外を表す <see cref="Exception"/>。</param>
        public IniFileFormatException(string message, string sectionName, string line, int index, Exception inner)
            : base(message, inner)
        {
            SectionName = sectionName;
            Line = line;
            LineIndex = index;
        }
        /// <summary><see cref="IniFileFormatException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="context">スローされている例外に関するシリアル化済みオブジェクト データを保持している <see cref="SerializationInfo"/>。</param>
        /// <param name="info">転送元または転送先に関するコンテキスト情報を含んでいる <see cref="StreamingContext"/>。</param>
        protected IniFileFormatException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }

        /// <summary>現在の例外を説明するメッセージを取得します。</summary>
        public override string Message
        {
            get
            {
                if (base.Message == null)
                    return Properties.ExceptionMessage.IniFileFormatExceptionDefaultMessage;
                else
                    return base.Message;
            }
        }

        /// <summary>例外の発生したセクション名を取得・設定します。</summary>
        public string SectionName { get { return (string)Data["SectionName"]; } set { Data["SectionName"] = value; } }
        /// <summary>例外の発生した行の内容を取得・設定します。</summary>
        public string Line { get { return (string)Data["Line"]; } set { Data["Line"] = value; } }
        /// <summary>例外の発生した行位置を取得・設定します。</summary>
        public int LineIndex { get { return (int)Data["LineIndex"]; } set { Data["LineIndex"] = value; } }
    }
}